package com.cloud.adrian.novel.book.service;

import com.cloud.adrian.novel.book.dto.req.*;
import com.cloud.adrian.novel.book.dto.resp.*;
import com.cloud.adrian.novel.common.resp.PageRespDto;
import com.cloud.adrian.novel.common.resp.RestResp;

import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * 小说模块 服务类
 * @Author: xiangguiliang
 * @version: 1.0
 * @since: 2024/05/18
 */
public interface BookService {

    /**
     * 查询列表小说信息
     * @param bookIds 小说id集合
     * @return 小说信息集合
     */
    RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds);

    /**
     * 小说点击榜查询
     * @return 小说点击榜 列表排名
     */
    RestResp<List<BookRankRespDto>> listVisitRankBooks();

    /**
     * 小说新书榜查询
     * @return 小说新书榜 列表排名
     */
    RestResp<List<BookRankRespDto>> listNewestRankBooks();

    /**
     * 小说更新榜查询
     * @return 小说更新榜 列表排名
     */
    RestResp<List<BookRankRespDto>> listUpdateRankBooks();

    /**
     * 获取小说信息
     * @param bookId 小说id
     * @return 小说信息
     */
    RestResp<BookInfoRespDto> getBookById(Long bookId);

    /**
     * 小说阅读数增加
     * @param bookId 小说id
     * @return void
     */
    RestResp<Void> addVisitCount(Long bookId);

    /**
     * 小说最新章节查询
     * @param bookId 小说id
     * @return 小说最新章节信息
     */
    RestResp<BookChapterAboutRespDto> getLastChapterAbout(Long bookId);

    /**
     * 查询小说最新评论
     * @param bookId 小说id
     * @return 小说最新评论
     */
    RestResp<BookCommentRespDto> listNewestComments(Long bookId);

    /**
     * 小说同类推荐列表查询
     * @param bookId 小说id
     * @return 同类推荐列表
     * @throws NoSuchAlgorithmException
     */
    RestResp<List<BookInfoRespDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException;

    /**
     * 发布小说评论
     * @param dto 评论相关dto
     * @return void
     */
    RestResp<Void> saveComment(BookCommentReqDto dto);

    /**
     * 用户评论更新
     * @param dto 评论相关dto
     * @return void
     */
    RestResp<Void> updateComment(BookCommentReqDto dto);

    /**
     * 用户删除评论
     *
     * @param dto 评论相关dto
     * @return void
     */
    RestResp<Void> deleteComment(BookCommentReqDto dto);

    /**
     * 小说章节列表查询
     * @param bookId 小说id
     * @return 小说章节列表
     */
    RestResp<List<BookChapterRespDto>> listChapters(Long bookId);

    /**
     * 小说章节内容查询
     * @param chapterId 章节id
     * @return 小说章节内容
     */
    RestResp<BookContentAboutRestDto> getBookContentAbout(Long chapterId);

    /**
     * 获取当前章节得上一章id
     * @param chapterId 当前章节id
     * @return 上一章节id
     */
    RestResp<Long> getPreChapterId(Long chapterId);

    /**
     * 获取当前章节得下一章id
     * @param chapterId 当前章节id
     * @return 下一章节id
     */
    RestResp<Long> getNextChapterId(Long chapterId);


    /**
     * 小说分类列表查询
     * @param workDirection 作品方向 0-男频，1-女频
     * @return 分类列表
     */
    RestResp<List<BookCategoryRespDto>> listCategory(Integer workDirection);

    /**
     * 查询下一批保存到es的小说列表
     * @param maxBookId 最大小说id
     * @return 下一批保存到es的小说列表
     */
    RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId);

    /**
     * 发布小说
     * @param dto 小说相关dto
     * @return void
     */
    RestResp<Void> publishBook(BookAddReqDto dto);

    /**
     * 查询作家发布文章列表
     * @param dto 书籍分页请求
     * @return 书籍分页响应
     */
    RestResp<PageRespDto<BookInfoRespDto>> listAuthorBooks(BookPageReqDto dto);

    /**
     * 小说章节发布
     * @param dto 章节相关dto
     * @return void
     */
    RestResp<Void> publishBookChapters(ChapterAddReqDto dto);

    /**
     * 小说章节列表查询
     * @param dto 章节列表分页请求
     * @return 章节分页响应
     */
    RestResp<PageRespDto<BookChapterRespDto>> listBookChapters(ChapterPageReqDto dto);

    /**
     * 小说章节内容查询
     * @param dto 章节内容请求
     * @return 章节内容响应
     */
    RestResp<BookChapterContentRespDto> getChapterContent(ChapterContentReqDto dto);

    /**
     * 小说章节内容更新
     * @param dto 章节内容更新请求
     * @return void
     */
    RestResp<Void> updateChapter(ChapterAddReqDto dto);

    /**
     * 小说章节内容删除
     * @param dto 章节内容删除请求
     * @return void
     */
    RestResp<Void> deleteChapter(ChapterContentReqDto dto);

    /**
     * 查询小说详情
     * @param bookId 小说id
     * @return 小说详情
     */
    RestResp<BookEsRespDto> selectEsBookById(Long bookId);
}
